import re

import django_redis
from django.core.handlers.exception import response_for_exception
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render

# Create your views here.

def test(request):
    return HttpResponse('test')

"""
需求分析:分析网页要实现的功能(如输入输出等),
"""
# 当登录的某数据(如姓名)输入完成时会发送一个ajax请求对数据进行后台的验证 我们要做的就是通过收取用户发出的请求
# 并对ajax进行处理
"""
判断用户名是否重复的功能
前端:发出 ajax请求
    收集后端发出的数据 并做出响应
后端: 接收请求 : 接受用户名
     处理业务逻辑 : 从数据库中查询,如果查询数量为零表示未重复命名
                                查询结果非零表示重复命名
     响应 : 向前端发送JSON数据 {code:0,count:0/1,errmsg:ok}
            this.host + '/usernames/' + this.username + '/count/'
     步骤:1.获取用户名
         2.根据用户名查询数据库
         3.返回响应
"""
from django.views import View
from apps.users.models import User
from django.http import JsonResponse
class UsernameCountView(View):
    # ajax通过get方式发送请求
    def get(self, request,username):
        users_count = User.objects.filter(username=username).count()
        return JsonResponse({'code':0,'count':users_count,'errmsg':'ok'})

class MobileCountView(View):
    def get(self, request,mobile):
        phone_count=User.objects.filter(mobile=mobile).count()
        return JsonResponse({'code':0,'count':phone_count,'errmsg':'ok'})
import json
from django.contrib.auth import login
from django_redis import get_redis_connection
class register(View):
    def post(self, request):
        #1.接受POST的json数据
        json_str=request.body
        json_str = json_str.decode('utf-8')
        body_dict = json.loads(json_str)
        # 2.获取数据
        username = body_dict.get('username')
        mobile = body_dict.get('mobile')
        password = body_dict.get('password')
        password2 = body_dict.get('password2')
        allow=body_dict.get('allow')
        sms_code=body_dict.get('sms_code')
        #验证数据
        #all中的元素 只要是  None 或 false all就直接返回False,否则返回True
        if not all([username,mobile,password,password2,allow]):
            return JsonResponse({'code':400,'errmsg':'参数不全'})
        if not re.match(r'^[a-zA-Z_-]{5,20}$', username):
            return JsonResponse({'code': 400, 'errmsg': '参数格式错误'})
        if not re.match(r'^[a-zA-Z0-9]{8,20}$', password):
            return JsonResponse({'code': 400, 'errmsg': '参数格式错误'})
        if not password==password2:
            return JsonResponse({'code': 400, 'errmsg': '两次密码不重复'})
        if not allow==True:
            return JsonResponse({'code': 400, 'errmsg': '未允许协议'})
        redis_cli=get_redis_connection('code')
        redis_code=redis_cli.get(mobile)
        if redis_code !=sms_code :
            return JsonResponse({'code': 400, 'errmsg': '短信验证不通过'})
        # 数据入库
        # 未加密写法 create 无法实现加密
        # User.objects.create(username=username, mobile=mobile,password=password)
        # 加密写法 create_user 可以实现加密
        user=User.objects.create_user(username=username, mobile=mobile, password=password)
        # 系统为我们提供了状态保持的方法
        login(request, user)
        return JsonResponse({'code': 0, 'errmsg': 'ok'})

"""
如果注册成功后即表示用户直接登录 此时注册完成后直接跳转到首页 我们要进行状态保持(注册成功即已经登录)
 此时注册完成后直接跳转到登录 我们不要进行状态保持(注册成功单独登录)
 
 实现状态保持主要有两种方法:
    Cookie
    Session(常用)
    系统为我们提供了状态保持的方法
"""


"""
用户登录
前端
    当用户把用户名和密码输入完成后,会点击登录按钮.这个时候前端因该会发送一个axios请求
后端:
    1.请求: 接受数据,验证数据
    2.业务逻辑: 验证用户名与密码是否正确,session
    3.响应: 返回JSON数据
步骤 1.接收数据
    2.验证数据
    3.验证用户名和密码是否正确
    4.session
    5.判断是否记住登录
    6.返回响应
"""

class loginview(View):
    def post(self, request):
        # 1.接收数据
        # json_str=request.body
        # data_str = json_str.decode('utf-8')
        # body_dict = json.loads(data_str)
        body_dict=json.loads(request.body.decode('utf-8'))
        username = body_dict.get('username')
        password = body_dict.get('password')
        remember = body_dict.get('remembered')
        # 2.验证数据
        if not all([username,password]):
            return JsonResponse({'code':400,'errmsg':'参数不全'})
        # 我们要确定时更具手机号查询还是以用户名查询
        # 通过更改User模版中的USERNAME_FIELD可以将authenticate匹配对象选为user数据库中的任意列
        # authenticate就是通过USERNAME_FIELD来查询的
        if re.match("1[345789]\d{9}",username):
            User.USERNAME_FIELD='mobile'
        else:
            User.USERNAME_FIELD = 'username'
        # 3.验证用户名和密码是否正确
        # 方法1:计数法
        # count=User.objects.filter(username=username,password=password).count()
        # if(count==0):
        #     return JsonResponse({'code': 400, 'errmsg': '用户名或密码错误'})
        # 方法2:系统提供了一种方法
        from django.contrib.auth import authenticate
        # 如果用户名与密码正确就返回User信息
        # 如果用户名与密码不正确就返回None
        user = authenticate(username=username, password=password)
        if(user is None):
            return JsonResponse({'code': 400, 'errmsg': '用户名或密码错误'})
        # 4.session
        from django.contrib.auth import login
        login(request,user)
        # 5.判断是否记住登录
        if remember is not None:
            # 记住登录 -- 2周
            request.session.set_expiry(None)
        else:
            # 不记住登录
            request.session.set_expiry(0)
        # 6.返回响应
        response= JsonResponse({'code': 0, 'errmsg': 'ok'})
        response.set_cookie('username',username)
        return response

"""
用户登出
前端
    登录后,点击退出按键 前端发出请求
后端:
    1.请求: 接受请求
    2.业务逻辑: 退出
    3.响应: 返回JSON数据
步骤 
注意 : 利用delete处理请求
"""
# django提供了登出函数
from django.contrib.auth import logout
class logoutview(View):
    def delete(self,request):
        # 杀死session
        logout(request)
        # 杀死cookie
        response = JsonResponse({'code': 0, 'errmsg': 'ok'})
        response.delete_cookie('username')
        return response